package vue.noteEleve;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ItemListener;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;

import metier.Eleve;
import metier.Grade;
import metier.Matiere;
import metier.NoteEleve;
import metier.Stage;
import vue.commun.JPanJTable;
import ctr.commun.CommunGest;
import ctr.noteEleve.GestModifNoteEleve;

public class JPanModifNoteEleve extends JPanel {



	
		/**
	 * 
	 */
	private static final long serialVersionUID = 4149389454436818844L;
		private JPanJTable panJTable;
		private JPanJTable panJTableNote;
		
		private JTextField jtf_Note;
		private JTextField jtf_Date;
		
		private JPanModifNoteEleve jPanModifNoteEleve;
		
		private Stage stage;
		
		private Boolean bl_visible;
		private Boolean bl_visibleModifier;

		
		private JComboBox jcb_Stage;
		private JComboBox jcb_Matiere;
		
		private Eleve eleve ;
		
		private Matiere matiere;
		
		private NoteEleve noteEleve;
		

		
		public JPanModifNoteEleve(String titre,Stage stage) {
			
			this.stage = stage;
			this.bl_visible=false;
			this.bl_visibleModifier=false;
			this.eleve = null;
			this.matiere = new Matiere(null, null);
			this.noteEleve = new NoteEleve(null, null, null, null);
			
			if (stage!=null) {
				init(titre);
			}else {
				JOptionPane.showMessageDialog(this, "Aucun stage saisi, ajout de note impossible", "Probleme", JOptionPane.WARNING_MESSAGE);
			}
			
			
		}
		
		public  JPanModifNoteEleve(String titre,JPanModifNoteEleve jPanModifNoteEleve) {
			this.stage = jPanModifNoteEleve.getStage();
			this.matiere = jPanModifNoteEleve.getMatiere();
			this.eleve=jPanModifNoteEleve.getEleve();
			this.bl_visible=jPanModifNoteEleve.getBl_visible();
			this.bl_visibleModifier=jPanModifNoteEleve.getBl_visibleModifier();
			this.jPanModifNoteEleve = jPanModifNoteEleve;
			this.jcb_Stage = jPanModifNoteEleve.getJcb_Stage();
			this.jcb_Matiere = jPanModifNoteEleve.getJcb_Matiere();
			this.noteEleve = jPanModifNoteEleve.getNoteEleve();
			init(titre);
		}
		
		private  void init(String titre){
			
			// On test si des stages existe, sinon message erreur.
			// On initialise qu'a l'implementation
			if (this.jPanModifNoteEleve==null) {
				// Recuperation et creation de la comboBox de liste des stages.
				CommunGest communGest = new CommunGest();
				jcb_Stage = new JComboBox(communGest.getListeStage().toArray());
				// je selectionne le premier stage
				this.jcb_Stage.setSelectedItem(stage);
				// en cas de changment de ma comboBox je selectionnne un nouveau stage
				this.jcb_Stage.addItemListener(new GestModifNoteEleve(this,null, null));
				
				//j'init ma jcb_Matiere
				jcb_Matiere = new JComboBox(new CommunGest().getListeMatiere().toArray());
				this.jcb_Matiere.setSelectedItem(new CommunGest().getListeMatiere().get(0));
				this.jcb_Matiere.addItemListener(new GestModifNoteEleve(this, null, null));
				jcb_Matiere.setName("jcb_Matiere");
				jcb_Stage.setName("jcb_Stage");
			}else{
				ItemListener[] itemListeners = this.jcb_Matiere.getItemListeners();
				for (ItemListener itemListener : itemListeners) {
					this.jcb_Matiere.removeItemListener(itemListener);
				}
				this.jcb_Matiere.addItemListener(new GestModifNoteEleve(this, null, null));
			}
			
			// ------------------------------------
			// Insertion du tableau des eleves
			// ------------------------------------
			if (panJTable == null ){
				getTableauEleves();
			}
	
			
			// Panel global
			// Avec mise en forme.
			this.setBorder(new TitledBorder(titre));
			
			
			
			String abrevationGrade="";
			if (this.eleve!=null) {
				Grade grade = new CommunGest().getGrade(this.eleve.getIdGrade());
				 abrevationGrade = grade.getAbrev();
			}
			
			//lbl_EleveSelectionne
			String selection = "";
			if ( eleve != null ){
				selection = "L'éleve selectionné est le "+abrevationGrade+" "
						+this.eleve.getNomEleve()+" "+this.eleve.getPrenom();
			}else{
				selection = "L'éleve selectionné est le ";
			}
			JLabel lbl_EleveSelectionne = new JLabel(selection);
			JLabel lbl_Note = new JLabel("Note");
			JLabel lbl_Matiere = new JLabel("Matiere");
			JLabel lbl_Date = new JLabel("Date");
			
			this.jtf_Note = new JTextField();
			this.jtf_Date = new JTextField();
			SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
			String message = "Vous avez selectionne la note du XX/XX/XXXX";
			if (noteEleve.getIdEleve()!=null) {
				this.jtf_Note.setText(""+this.noteEleve.getNote());
				this.jtf_Date.setText(""+simpleDateFormat.format(this.noteEleve.getDateNote()));
				message = "Vous avez selectionne la note du " + simpleDateFormat.format(this.noteEleve.getDateNote());
			}else{
				this.jtf_Note.setText("00.0");
				this.jtf_Date.setText(""+simpleDateFormat.format(new Date()));
			}
		
			
			
			
			//-----------------------------------------------------------------
			//Panel de tableau JVector pour obtenir les notes: panJTableNote
			//-----------------------------------------------------------------
			if (panJTableNote == null ){
				getTableauNote();
			}
			
			JButton jButtonAjoutEleve = new JButton("Valider");
			jButtonAjoutEleve.addActionListener(new GestModifNoteEleve(this,null, null));
			
			//creation du JLabel selection de la note
			JLabel lbl_selectionNote = new JLabel(message);
			//tant que je n'ai pas sélectionné un éleve, mes composants du panel "panelAjoutNote"
			//sont invisibles
			
			lbl_Matiere.setEnabled(this.getBl_visible());
			this.jcb_Matiere.setEnabled(this.getBl_visible());
			lbl_EleveSelectionne.setEnabled(this.getBl_visible());
			
			
			panJTableNote.setVisible(this.getBl_visible());
		
			
			lbl_Note.setEnabled(this.getBl_visibleModifier());
			this.jtf_Note.setEnabled(this.getBl_visibleModifier());
			jButtonAjoutEleve.setEnabled(this.getBl_visibleModifier());
			lbl_Date.setEnabled(this.getBl_visibleModifier());
			jtf_Date.setEnabled(false);
			lbl_selectionNote.setEnabled(this.getBl_visibleModifier());
			
			// Panel de label :sélection du stage : 
			JPanel panelLabel = new JPanel(new GridLayout(1,1));
			panelLabel.add(new JLabel("sélection du stage : "));
			
			//Panel de tableau JVector pour obtenir les eleves
			JPanel panelTableau = new JPanel(new GridLayout(1,1));
			panelTableau.add(this.panJTable);
			
			//Panel qui m'affiche le tableau des note de l'eleve par matiere
			JPanel panelModifierNote = new JPanel();
			panelModifierNote.add(this.panJTableNote,BorderLayout.CENTER);
			
			// Panel de saisi
			JPanel panelSaisi = new JPanel(new GridLayout(1,1));
			panelSaisi.add(jcb_Stage);
			
			//panel pour matiere
			JPanel panelMatiere = new JPanel(new GridLayout(1,2));
			//Panel qui m'affiche l eleve selectionne
			JPanel panelLabelEleve = new JPanel(new GridLayout(1,1));
			panelLabelEleve.add(lbl_EleveSelectionne);
			panelMatiere.add(panelLabelEleve);
			
			JPanel panelLabelMatiere = new JPanel();
			panelLabelMatiere.add(lbl_Matiere);
			panelLabelMatiere.add(jcb_Matiere);
			panelMatiere.add(panelLabelMatiere);
			
			//panel pour label note selectionne
			JPanel panelNoteSelectionne = new JPanel(new GridLayout(3,1));
			panelNoteSelectionne.add(lbl_selectionNote);
			
			//panel pour modifier note et date, et bouton valider
			JPanel panelNoteDateBouton = new JPanel();
			panelNoteDateBouton.add(lbl_Note);
			panelNoteDateBouton.add(jtf_Note);
			panelNoteDateBouton.add(lbl_Date);
			panelNoteDateBouton.add(jtf_Date);
			panelNoteDateBouton.add(jButtonAjoutEleve);
			
			//j'ajoute mes composants dans mon panel "panelModifierNote"
			
			this.setLayout(new BorderLayout());
			
			//je personnalise mes panels : panneau Nord
			JPanel panneauNord = new JPanel(new GridLayout(1,2));
			panneauNord.add(panelLabel);
			panneauNord.add(panelSaisi);
			
			//je personnalise mes panels : panneau Centre
			JPanel panneauCentre = new JPanel(new GridLayout(5,1));
			panneauCentre.add(panelTableau);
			//panneauCentre.add(panelLabelEleve);
			panneauCentre.add(panelMatiere);
			panneauCentre.add(panelModifierNote);
		
			
			
			//je personnalise mes panels : panneau sud
			JPanel panneauSud = new JPanel(new GridLayout(1,3));
			panneauSud.add(panelNoteSelectionne,BorderLayout.WEST);
			panneauSud.add(panelNoteDateBouton,BorderLayout.CENTER);
			
			this.add(panneauNord,BorderLayout.NORTH);
			this.add(panneauCentre,BorderLayout.CENTER);
			this.add(panneauSud,BorderLayout.SOUTH);
		}
		
		/**
		 * @return
		 */
		private JPanJTable getTableauNote(){

			//nom des colonnes
			Vector<Object> nomColonne= new Vector<Object>(Arrays.asList(new String[] {"Note","Date"}));
			
			//valeurs des lignes
			Vector<Vector<Object>> dataVector= new Vector<Vector<Object>>();
			
			 //Ajout d'un vector Note.
			if (eleve!=null) {
				ArrayList<NoteEleve>lNoteEleve = new CommunGest().getListeNoteEleveByMatiere(eleve, matiere);
				SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
				for (NoteEleve parNoteEleve : lNoteEleve) {
					dataVector.add(new Vector<Object>(Arrays.asList(new Object[]{
							parNoteEleve.getNote(),simpleDateFormat.format(parNoteEleve.getDateNote())	
					})));
				}
			}
			
			
			panJTableNote = new JPanJTable(null, dataVector, nomColonne, null);
			//ajout d'un gestionnnaire de souris, lorsque je clique sur le nom d'un eleve il apparait 
			//les informations pour ajouter une nouvelle note à celui-ci
			
			panJTableNote.getJtable().addMouseListener(new GestModifNoteEleve(this,this.panJTableNote, null));
			panJTableNote.getJtable().setName("tabNotes");
			return panJTableNote;
		
		}
		
		private JPanJTable getTableauEleves(){

			//nom des colonnes
			Vector<Object> nomColonne= new Vector<Object>(Arrays.asList(new String[] {"nom","Prenom", "date de naissance"}));
			
			//valeurs des lignes
			Vector<Vector<Object>> dataVector= new Vector<Vector<Object>>();
			
			 //Ajout d'un vector eleve.
			ArrayList<Eleve>lEleve = new CommunGest().getListeEleve(stage);
			SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
			for (Eleve eleve : lEleve) {
				dataVector.add(new Vector<Object>(Arrays.asList(new Object[]{
					eleve.getNomEleve(),eleve.getPrenom(),simpleDateFormat.format(eleve.getDateNaissance())	
				})));
			}
			
			panJTable = new JPanJTable(null, dataVector, nomColonne, null);
			panJTable.getJtable().setName("tabEleve");
			//ajout d'un gestionnnaire de souris, lorsque je clique sur le nom d'un eleve il apparait 
			//les informations pour ajouter une nouvelle note à celui-ci
			panJTable.getJtable().addMouseListener(new GestModifNoteEleve(this,this.panJTable, lEleve));
			return panJTable;
		}

		public JComboBox getJcb_Stage() {
			return jcb_Stage;
		}

		public JPanJTable getPanJTable() {
			return panJTable;
		}

		public JPanModifNoteEleve getJPanModifNoteEleve() {
			return jPanModifNoteEleve;
		}

		public Stage getStage() {
			return stage;
		}
		public void setStage(Stage stage) {
			this.stage = stage;
		}



		public JTextField getJtf_Note() {
			return jtf_Note;
		}

		public JComboBox getJcb_Matiere() {
			return jcb_Matiere;
		}
		

		public void setJcf_Matiere(JComboBox jcf_Matiere) {
			this.jcb_Matiere = jcf_Matiere;
		}

		public Boolean getBl_visible() {
			return bl_visible;
		}

		public void setBl_visible(Boolean bl_visible) {
			this.bl_visible = bl_visible;
		}

		public Eleve getEleve() {
			return eleve;
		}

		public void setEleve(Eleve eleve) {
			this.eleve = eleve;
		}

		public JTextField getJtf_Date() {
			return jtf_Date;
		}

		public Matiere getMatiere() {
			return matiere;
		}

		public void setMatiere(Matiere matiere) {
			this.matiere = matiere;
		}

		public NoteEleve getNoteEleve() {
			return noteEleve;
		}

		public void setNoteEleve(NoteEleve noteEleve) {
			this.noteEleve = noteEleve;
		}

		public Boolean getBl_visibleModifier() {
			return bl_visibleModifier;
		}

		public void setBl_visibleModifier(Boolean bl_visibleModifier) {
			this.bl_visibleModifier = bl_visibleModifier;
		}
		
		
		
		
}
	
